package entidades;

import util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedList;
import com.google.gson.Gson;

/**
 * @author JFM
 */
public class Formato extends Entidad
	{
   	private int lineaId;
	private int dimensionesId;
	private float desarrollo;

	static final String NOMBRE_TABLA = "formatos";

	private Linea linea;
	private Dimensiones dimensiones;
        private boolean activo;
	// --- Constructores --- //

	public Formato()
		{
		lineaId = 0;
		dimensionesId = 0;
		desarrollo = 0;

		linea = null;
		dimensiones = null;
                activo = true;
		}

	public Formato(int id) throws SQLException
	{
//          StringBuffer sb = new StringBuffer();
//          sb.append("SELECT f.id, fl.linea_id, f.dimensiones_id, f.desarrollo  ");
//          sb.append(" FROM formatos f, formatos_linea fl where f.id = fl.id_formato and  f.id = " + this.getId());
          String str = "SELECT f.id, fl.linea_id, f.dimensiones_id, f.desarrollo, f.activo FROM formatos f JOIN formatos_linea fl ON (fl.id_formato = f.id) where f.id = " + id;
            ResultSet result = MySQL.executeQuery(str);
		if(result.next()) {
                    this.leer(result);
                }
		result.getStatement().close();
        }

	public Formato(String id) throws SQLException
		{ super(id); }

	public Formato(ResultSet result) throws SQLException
		{ super(result); }

	public Formato(ResultSet result, String prefix) throws SQLException
		{ super(result, prefix); }

        public boolean isActivo()
		{ return activo; }
	public void setActivo(boolean activo)
		{ this.activo = activo; }
	public void setActivo(String activo)
		{ this.activo = activo != null && ( activo.compareTo("1") == 0 || activo.compareTo("true") == 0); }


	// --- Metodos get()/set() --- //

	public float getDesarrollo()
		{ return desarrollo; }
	public String getDesarrolloToString()
		{
		String res = desarrollo + "";
		if(res.length() > 2 && res.substring(res.length()-2).compareTo(".0") == 0)
			{ res = res.substring(0, res.length()-2); }
		return res;
		}
	public void setDesarrollo(float desarrollo)
		{ this.desarrollo = desarrollo; }
	public void setDesarrollo(String desarrollo)
		{ this.desarrollo = Float.parseFloat(desarrollo); }

	public int getLineaId()
		{ return lineaId; }
	public void setLineaId(int lineaId)
		{ this.lineaId = lineaId; }
	public void setLineaId(String lineaId)
		{ try{this.lineaId = Integer.parseInt(lineaId);}catch(Exception e) {this.lineaId = 0;} }

	public Linea getLinea() throws SQLException
		{
		if(linea == null || lineaId != linea.getId())
			{ linea = new Linea(lineaId); }
		return linea;
		}
	public void setLinea(Linea linea)
		{ this.linea = linea; }

	public int getDimensionesId()
		{ return dimensionesId; }
	public void setDimensionesId(int dimensionesId)
		{ this.dimensionesId = dimensionesId; }
	public void setDimenesionesId(String dimensionesId)
		{ try{this.dimensionesId = Integer.parseInt(dimensionesId);}catch(Exception e) {this.dimensionesId = 0;} }

	public Dimensiones getDimensiones() throws SQLException
		{
		if(dimensiones == null || dimensionesId != dimensiones.getId())
			{ dimensiones = new Dimensiones(dimensionesId); }
		return dimensiones;
		}
	public void setDimensiones(Dimensiones dimensiones)
		{ this.dimensiones = dimensiones; }

	@Override
	public String getDescriptor()
		{
		String res = "";
		try{ res = getLinea().getInicial() + getDimensiones().getDescriptor(); }catch(SQLException e) {}
		return res;
		}

	@Override
	public String toJson()
		{
		HashMap map = new HashMap();
		map.put("id", id);
		map.put("dimensiones_id", dimensionesId);
		map.put("linea_id", lineaId);
		map.put("desarrollo", desarrollo);
                map.put("activo", activo);
		return new Gson().toJson(map);
		}

	@Override
	public String getNombreTabla()
		{ return NOMBRE_TABLA; }

	@Override
	public String toString()
		{ return getDescriptor(); }

	@Override
	public void leer(ResultSet result, String prefijo) throws SQLException
		{
		this.setId(result.getInt(prefijo + "id"));
		this.setLineaId(result.getInt(prefijo + "linea_id"));
		this.setDimensionesId(result.getInt(prefijo + "dimensiones_id"));
		this.setDesarrollo(result.getInt(prefijo + "desarrollo"));
                this.setActivo(result.getBoolean(prefijo + "activo"));
		}
        public void leerFormatoTabla(ResultSet result, String prefijo) throws SQLException
		{
		this.setId(result.getInt(prefijo + "id"));
		this.setDimensionesId(result.getInt(prefijo + "dimensiones_id"));
		this.setDesarrollo(result.getInt(prefijo + "desarrollo"));
                this.setActivo(result.getBoolean(prefijo + "activo"));
		}

	@Override
	public void guardar() throws SQLException
		{
		int idNuevo = id;
                ResultSet result = MySQL.executeQuery("Call Formatos_Save(" +
				MySQL.formatId(id) + "," +
				MySQL.formatId(lineaId) + "," +
				MySQL.formatId(dimensionesId) + "," +
				MySQL.format(desarrollo) +  "," + MySQL.formatBit(activo) +")");

		if(result.next())
			{
			if( result.getMetaData().getColumnCount() == 1)
				{ throw new SQLException(result.getString("mensaje")); }
			else{ 
                             leerFormatoTabla(result, "");
                             result.getStatement().close();
                             if ( idNuevo == 0){
                                ResultSet result2 = MySQL.executeQuery("Call FormatosLinea_Save(" +
                                MySQL.formatId(lineaId) + "," + MySQL.formatId(id) + " )");
                                    result2.getStatement().close();
                             }
			}

		}
    }

	@Override
	public void borrar() throws SQLException
		{ borrar(id+""); }

	public static void borrar(String id) throws SQLException
		{
		String msj = null;
		ResultSet result = MySQL.executeQuery("Call Formatos_Delete("+id+")");
		if(result.next())
			{ msj = result.getString("mensaje"); }
		result.getStatement().close();
		if(msj != null && msj.compareToIgnoreCase("ok") != 0)
			{ throw new SQLException(msj); }
		}

	public static int getId(String formato) throws SQLException
		{
		int formatoId = 0;
		
		if(formato != null && formato.length() > 0 && formato.contains("x"))
			{		
			String inicial = formato.substring(0, 1);
			formato = formato.substring(1);
			String ancho = formato.split("x")[0];
			String largo = formato.split("x")[1];
			String alto = formato.split("x")[2];
				
			ResultSet result= MySQL.executeQuery("SELECT id FROM formatos_view WHERE linea_inicial = '"+inicial+"' AND ancho = "+ancho+" AND largo = "+largo+" AND altura = "+alto);
			if(result.next())
				{ formatoId = result.getInt("id"); }
			result.getStatement().close();
			}
		
		return formatoId;
		}
	
	public static List<Formato> listar() throws SQLException
		{ 
               return (List) Entidad.listar(Formato.class, "formatos_view", "linea_inicial ASC, ancho ASC, largo ASC, altura ASC");
        }

        public static List<Formato> listarOrderById() throws SQLException
		{
                LinkedList lista = new LinkedList();
                String query = "select DISTINCT f.* from formatos f inner join formatos_x_newlong fn on ( fn.formato_id = f.id) order by f.id asc";

                ResultSet result = MySQL.executeQuery(query);
		while(result.next()) {
                    Formato f = new Formato(result.getInt("id"));
//                    f.leer(result);
                    lista.add(f);
                }
		result.close();

		return lista;
        }

        public static Formato getFormatoById(int id) throws SQLException{
            String where = " id = " + id;
            LinkedList lista = (LinkedList) Entidad.buscar(Formato.class, NOMBRE_TABLA, where);
            return (Formato)lista.get(0);
        }

	public static long getMetros(int idFormato, long cantidad) throws SQLException
		{
		double desarrollo = 0;
		ResultSet result = MySQL.executeQuery("SELECT desarrollo FROM " + NOMBRE_TABLA + " WHERE id = " + idFormato + " LIMIT 1");
		if(result.next()) { desarrollo = result.getDouble("desarrollo"); }
		result.getStatement().close();
		return (long)((double)cantidad * desarrollo / 100.0);
		}
	}
